function AoD_groups = extract_AoD_support(angles, groups, G)
% EXTRACT_AOD_SUPPORT 提取用户组AoD支持区域（公式13）
%   输入：
%     angles: 用户角度结构体数组
%     groups: 用户分组结果 [K×1]
%     G: 实际用户组数
%   输出：
%     AoD_groups: [1×G]结构体数组，包含每组AoD支持区域信息
%        - psi_range: [min_psi, max_psi] 方位角范围(度)
%        - theta_range: [min_theta, max_theta] 仰角范围(度)
%        - gamma_x_range: [min_gx, max_gx] 水平波数范围
%        - gamma_y_range: [min_gy, max_gy] 垂直波数范围

    % ========== 1. 初始化输出结构 ==========
    AoD_groups = struct(...
        'psi_range', cell(1,G), ...
        'theta_range', cell(1,G), ...
        'gamma_x_range', cell(1,G), ...
        'gamma_y_range', cell(1,G));
    
    % ========== 2. 遍历每个用户组 ==========
    for g = 1:G
        % 2.1 获取当前组所有用户索引
        group_users = find(groups == g);
        
        % 2.2 初始化角度集合
        all_psi = [];
        all_theta = [];
        all_gamma_x = [];
        all_gamma_y = [];
        
        % 2.3 收集组内所有路径角度
        for u = group_users
            all_psi = [all_psi; angles(u).azimuth_angles];
            all_theta = [all_theta; angles(u).elevation_angles];
            all_gamma_x = [all_gamma_x; angles(u).gamma_x];
            all_gamma_y = [all_gamma_y; angles(u).gamma_y];
        end
        
        % ========== 3. 计算角度范围（公式13） ==========
        % 3.1 方位角范围
        psi_min = min(all_psi);
        psi_max = max(all_psi);
        
        % 3.2 仰角范围
        theta_min = min(all_theta);
        theta_max = max(all_theta);
        
        % 3.3 波数范围
        gamma_x_min = min(all_gamma_x);
        gamma_x_max = max(all_gamma_x);
        gamma_y_min = min(all_gamma_y);
        gamma_y_max = max(all_gamma_y);
        
        % ========== 4. 存储结果 ==========
        AoD_groups(g).psi_range = [psi_min, psi_max];
        AoD_groups(g).theta_range = [theta_min, theta_max];
        AoD_groups(g).gamma_x_range = [gamma_x_min, gamma_x_max];
        AoD_groups(g).gamma_y_range = [gamma_y_min, gamma_y_max];
    end
    
    % ========== 5. 验证结果 ==========
%     validate_AoD_support(AoD_groups, angles, groups);
end

%% ========== 子函数：结果验证 ==========
function validate_AoD_support(AoD_groups, angles, groups)
    for g = 1:length(AoD_groups)
        group_users = find(groups == g);
        
        % 检查组内用户角度是否在范围内
        for u = group_users
            % 方位角验证
            user_psi = angles(u).azimuth_angles;
            assert(all(user_psi >= AoD_groups(g).psi_range(1) & ...
                      user_psi <= AoD_groups(g).psi_range(2)), ...
                '用户%d方位角超出组%d范围', u, g);
            
            % 仰角验证
            user_theta = angles(u).elevation_angles;
            assert(all(user_theta >= AoD_groups(g).theta_range(1) & ...
                      user_theta <= AoD_groups(g).theta_range(2)), ...
                '用户%d仰角超出组%d范围', u, g);
            
            % 波数验证
            user_gx = angles(u).gamma_x;
            assert(all(user_gx >= AoD_groups(g).gamma_x_range(1) & ...
                      user_gx <= AoD_groups(g).gamma_x_range(2)), ...
                '用户%d水平波数超出组%d范围', u, g);
            
            user_gy = angles(u).gamma_y;
            assert(all(user_gy >= AoD_groups(g).gamma_y_range(1) & ...
                      user_gy <= AoD_groups(g).gamma_y_range(2)), ...
                '用户%d垂直波数超出组%d范围', u, g);
        end
    end
end